package thinkingInJava.io;
// page 576 演示会调用构造函数的序列化
//: io/Blips.java
//Simple use of Externalizable & a pitfall.
import java.io.*;
import static thinkingInJava.YTool.YPrint.*;

class Blip1 implements Externalizable {
	public Blip1() {
		print("Blip1 Constructor");
	}
	public void writeExternal(ObjectOutput out)
			throws IOException {
		print("Blip1.writeExternal");
	}
	public void readExternal(ObjectInput in)
			throws IOException, ClassNotFoundException {
		print("Blip1.readExternal");
	}
}

class Blip2 implements Externalizable {
	Blip2() { // 注意这里不是公共的，下面序列化会调用而异常
		print("Blip2 Constructor");
	}
	public void writeExternal(ObjectOutput out)
			throws IOException {
		print("Blip2.writeExternal");
	}
	public void readExternal(ObjectInput in)
			throws IOException, ClassNotFoundException {
		print("Blip2.readExternal");
	}
}

public class Blips {
	public static void main(String[] args)
			throws IOException, ClassNotFoundException {
		print("Constructing objects:");
		Blip1 b1 = new Blip1();
		Blip2 b2 = new Blip2();
		ObjectOutputStream o = new ObjectOutputStream(
				new FileOutputStream("Blips.out"));
		print("Saving objects:");
		o.writeObject(b1);
		o.writeObject(b2);
		o.close();
		// Now get them back:
		ObjectInputStream in = new ObjectInputStream(
				new FileInputStream("Blips.out"));
		print("Recovering b1:");
		b1 = (Blip1)in.readObject();
		// OOPS! Throws an exception:
		//! print("Recovering b2:");
		//! b2 = (Blip2)in.readObject();
	}
} /* Output:
Constructing objects:
Blip1 Constructor
Blip2 Constructor
Saving objects:
Blip1.writeExternal
Blip2.writeExternal
Recovering b1:
Blip1 Constructor
Blip1.readExternal
 *///:~
